package com.wangzhenyu.common.base

import android.app.Application
import android.os.Build
import android.webkit.WebView
import androidx.core.content.ContextCompat
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleOwner
import androidx.lifecycle.ProcessLifecycleOwner
import cn.jiguang.api.utils.JCollectionAuth
import cn.jpush.android.api.JPushInterface
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ProcessUtils
import com.blankj.utilcode.util.RomUtils
import com.blankj.utilcode.util.ToastUtils
import com.blankj.utilcode.util.Utils
import com.tencent.bugly.crashreport.CrashReport
import com.wangzhenyu.common.BuildConfig
import com.wangzhenyu.common.R
import com.wangzhenyu.common.base.bean.UserManager
import com.wangzhenyu.common.net.Fetch
import com.wangzhenyu.common.util.log.LogUtil


open class BaseApplication : Application() {

    companion object {

        //Application的Context
        lateinit var myApplication: BaseApplication

        //是否处于前台
        @Suppress("UNUSED")
        val isForeground
            get() = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
    }

    override fun onCreate() {
        super.onCreate()

        myApplication = this

        //监听整个APP
        ProcessLifecycleOwner.get().lifecycle.addObserver(processLifecycleObserver)

        //Android 9以上版本，不允许多进程使用同一个目录的WebView，需要为不同进程的WebView设置不同目录
        //也就是说Android P针对 WebView在不同进程下无法访问非自己进程中的webview目录
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
            val processName = ProcessUtils.getCurrentProcessName()
            if (processName !in arrayListOf(
                    "com.wangzhenyu.learn",
                    "com.wzy.business",
                    "com.wzy.project",
                    "com.wangzhenyu.learn.store",
                    "com.wzy.textbook"
                )
            ) {
                WebView.setDataDirectorySuffix(processName)
            }

        }

        if (ProcessUtils.isMainProcess()) {

            //region  Bugly
            //为了保证运营数据的准确性，建议不要在异步线程初始化Bugly
            //第三个参数为SDK调试模式开关，调试模式的行为特性如下：
            //输出详细的Bugly SDK的Log；
            //每一条Crash都会被立即上报；
            //自定义日志将会在Logcat中输出。
            //建议在测试阶段建议设置成true，发布时设置为false。
            CrashReport.initCrashReport(applicationContext, "1f84ec2ef0", BuildConfig.DEBUG)
            //endregion

            //region  JPush
            JPushInterface.setDebugMode(BuildConfig.DEBUG)
            //这里假设APP已经获得授权，事实上，需要先找用户拿到授权
            //如果用户拒绝授权或者第一次使用该APP，则该布尔值为false，这时初始化会被拦截
            //要想开始推送，需要拿到用户授权，然后调用JCollectionAuth.setAuth(this, true)，使用该方法，如果初始化被拦截过，将重试初始化过程
            val isPrivacyReady = true
            if (!isPrivacyReady) {
                //后续初始化过程将被拦截
                JCollectionAuth.setAuth(this, false)
            }
            JPushInterface.init(this)
            JPushInterface.stopCrashHandler(this)
            //endregion

            //初始化网络库
            Fetch.initNetConfig()
        }


    }


    //对APP的监听
    private val processLifecycleObserver by lazy {
        object : DefaultLifecycleObserver {
            override fun onStart(owner: LifecycleOwner) {
                super.onStart(owner)
                //LogUtil.default03("进入前台")
            }

            override fun onStop(owner: LifecycleOwner) {
                super.onStop(owner)
                // LogUtil.default03("进入后台")
            }
        }
    }

    fun loginOutByToken() {
         UserManager.loginOut()
    }

}